<?php

namespace app\controller;

use support\Request;

use XdbSearcher;

/**
 * IndexController类处理与IP信息相关的请求
 */
class IndexController
{
    /**
     * 获取指定IP地址的信息
     * 
     * @param Request $request
     * @return string
     */
    public function getIpInfo(Request $request)
    {
        try {
            $ip = $request->get('ip', '');
            if (!$ip) {
                return json_encode(['code' => 0, 'msg' => 'IP不能为空']);
            }

            $dbPath = run_path('database') . DIRECTORY_SEPARATOR . 'ip2region.xdb';

            // 1、从 dbPath 加载整个 xdb 到内存。
            // 备注：并发使用，用整个 xdb 缓存创建的 searcher 对象可以安全用于并发。
            $cBuff = XdbSearcher::loadContentFromFile($dbPath);
            if ($cBuff === null) {
                return json_encode(['code' => 0, 'msg' => 'xdb 文件不存在（' . $dbPath . '）']);
            }

            // 2、使用全局的 cBuff 创建带完全基于内存的查询对象。
            try {
                $searcher = XdbSearcher::newWithBuffer($cBuff);
            } catch (\Exception $e) {
                return json_encode(['code' => 0, 'msg' => 'xdb 文件格式错误（' . $dbPath . '）']);
            }

            // 3、查询
            $sTime = XdbSearcher::now();
            $region = $searcher->search($ip);
            if ($region === null) {
                return json_encode(['code' => 0, 'msg' => 'IP地址不在数据库中']);
            }

            // 4、返回查询结果
            $data = [
                'ip' => $ip,
                'region' => $region,
                'gap' => XdbSearcher::now() - $sTime,
            ];
        } catch (\Exception $ex) {
            return json_encode(['code' => 0, 'msg' => '系统错误：' . $ex->getMessage()]);
        }

        return json_encode(['code' => 1, 'data' => $data, 'msg' => 'success', 'time' => time()], JSON_UNESCAPED_UNICODE);
    }
}